#include <string>
#include "gtest/gtest.h"
#include "Truck.h"
#include "Wheel.h" 




/*--------------------------------------------------------------*/
/*	handig weetje:												*/
/* 	ASSERT: Fails fast, aborting the current function.			*/
/*	EXPECT: Continues after the failure.						*/
/*--------------------------------------------------------------*/


class CreateTruck : public ::testing::Test
{
    protected:

		int cnt;
		int aantal;	
        CreateTruck()
        {
			ptrVrachtAuto = new Truck("Leger","RVS",300,4,550);
        }

        virtual ~CreateTruck()
        {
            delete ptrVrachtAuto;
            ptrVrachtAuto = NULL;
        }
        Truck *ptrVrachtAuto;
        void addWheels(int amount)
        {
			for (int i=0; i<amount;i++)
			{
				ptrVrachtAuto->addWheel(300,"Steel");
			}
		}
};

TEST_F(CreateTruck, CheckModel)
{
    EXPECT_EQ(ptrVrachtAuto->getModel(),"Leger" );
}

TEST_F(CreateTruck, CheckAmountOfWheels)
{
	EXPECT_EQ(ptrVrachtAuto->getNrWheels(),4);
}

TEST_F(CreateTruck, Add16MoreWheels)
{
	
	addWheels(16);
	EXPECT_EQ(ptrVrachtAuto->getNrWheels(),20);
}

TEST_F(CreateTruck, RemoveWheelAtPosition2And9)
{
	addWheels(16); // let op er komen 4 extra wielen bij omdat ie al in de constructor worden aangemaakt.
	EXPECT_EQ(ptrVrachtAuto->getNrWheels(),20);
	
	ptrVrachtAuto->removeWheel(2);
	ptrVrachtAuto->removeWheel(9);
	
	
	EXPECT_EQ(ptrVrachtAuto->getNrWheels(),18);
}

TEST_F(CreateTruck, AddLicencePlate)
{
	string nummerPlaat = "61-zf-zv";
	ptrVrachtAuto->setLicensePlate(nummerPlaat);
	
	EXPECT_EQ(ptrVrachtAuto->getLicensePlate(),nummerPlaat);
}

TEST_F(CreateTruck, OperatorTest)
{
	Truck *karretje1 = new Truck("slaaper","peperkoek",456,10,1024);
	Truck *karretje2=(karretje1);
	EXPECT_EQ(karretje2->getModel(),"slaaper");
	EXPECT_EQ(karretje2->getNrWheels(),10);
	
	delete karretje1;
	//delete karretje2; kan niet want deze is niet gemaakt met NEW --> Dit resulteerd in segmentation fault
	
}
TEST_F(CreateTruck, CopyConstructorTest)
{
	string nummerPlaat = "666-lift-up";
	Truck *takel = new Truck("TakelWagen","aluminium",456,12,1524);
	takel->setLicensePlate(nummerPlaat); // maak een nummerplaat aan in de eerste instantie
	Truck *broerTakel = new Truck(*takel);
	
	EXPECT_EQ(broerTakel->getModel(),"TakelWagen");
	EXPECT_EQ(broerTakel->getNrWheels(),12);			  // wielen zijn angemaakt in de eerste constructor en daarna mee gecopieerd.
	EXPECT_EQ(broerTakel->getLicensePlate(),nummerPlaat); // controleer de nummerplaat in de 2de instantie.
	
	delete takel;
	delete broerTakel;
}

TEST_F(CreateTruck, WheelPropTest)
{
	Wheel *wiel = ptrVrachtAuto->getWheel(2);
	EXPECT_EQ(wiel->getDiameter(),300);
	EXPECT_EQ(wiel->getMaterial(),"RVS");
	
}

TEST_F(CreateTruck, CheckThePowerLevel)
{
	EXPECT_EQ(ptrVrachtAuto->getPower(),550);
}

TEST_F(CreateTruck, CheckNumberOfWheels)
{
	EXPECT_EQ(ptrVrachtAuto->getNrWheels(),4);
}
TEST_F(CreateTruck, AddWheelsCheckAmountOfWheels)
{
	addWheels(14); // + de vier die al in het object zitten.
	EXPECT_EQ(ptrVrachtAuto->getNrWheels(),18);
}

TEST_F(CreateTruck, AddWheelsToNewObjectAndCheck)
{
	Truck *mobileKraan = new Truck("TelescopeKraan","Magnesium" ,500,0,2000);
	EXPECT_EQ(mobileKraan->getNrWheels(),0);
	mobileKraan->addWheel(500,"Magnesium");
	mobileKraan->addWheel(500,"Magnesium");
	mobileKraan->addWheel(500,"Magnesium");
	mobileKraan->addWheel(500,"Magnesium");
	EXPECT_EQ(mobileKraan->getNrWheels(),4);
	
	delete mobileKraan;
}
